<!doctype html><html lang dir=ltr><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>11.7 ~ 11.9 | 汇编语言 | Hui.Ke - Blog</title><meta name=generator content="Hugo Eureka 0.9.3"><link rel=stylesheet href=https://b.hui.ke/css/eureka.min.9cec6350e37e534b0338fa9a085bf06855de3b0f2dcf857e792e5e97b07ea905d4d5513db554cbc26a9c3da622bae92d.css><script defer src=https://b.hui.ke/js/eureka.min.fa9a6bf6d7a50bb635b4cca7d2ba5cf3dfb095ae3798773f1328f7950028b48c17d06276594e1b5f244a25a6c969a705.js></script>
<link rel=preconnect href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=preload href="https://fonts.googleapis.com/css2?family=Lora:wght@400;600;700&family=Noto+Serif+SC:wght@400;600;700&display=swap" as=style onload='this.onload=null,this.rel="stylesheet"'><link rel=stylesheet href=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/styles/vs.min.css media=print onload='this.media="all",this.onload=null' crossorigin><script defer src=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/highlight.min.js crossorigin></script>
<script defer src=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/bash.min.js crossorigin></script>
<script defer src=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/ini.min.js crossorigin></script>
<script defer src=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/json.min.js crossorigin></script>
<script defer src=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/php.min.js crossorigin></script>
<script defer src=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/python.min.js crossorigin></script>
<script defer src=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/shell.min.js crossorigin></script>
<script defer src=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/sql.min.js crossorigin></script>
<script defer src=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/x86asm.min.js crossorigin></script>
<script defer src=https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/xml.min.js crossorigin></script>
<link rel=stylesheet href=https://b.hui.ke/css/highlightjs.min.2958991528e43eb6fc9b8c4f2b8e052f79c4010718e1d1e888a777620e9ee63021c2c57ec7417a3108019bb8c41943e6.css media=print onload='this.media="all",this.onload=null'><script defer type=text/javascript src=https://lib.baomitu.com/font-awesome/6.1.1/js/all.min.js></script>
<link rel=stylesheet href=https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.css integrity=sha384-MlJdn/WNKDGXveldHDdyRP1R4CTHr3FeuDNfhsLPYrq2t0UBkUdK2jyTnXPEK1NQ media=print onload='this.media="all",this.onload=null' crossorigin><script defer src=https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.js integrity=sha384-VQ8d8WVFw0yHhCk5E8I86oOhv48xLpnDZx5T9GogA/Y84DcCKWXDmSDfn13bzFZY crossorigin></script>
<script defer src=https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/contrib/auto-render.min.js integrity=sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR crossorigin></script>
<script>document.addEventListener("DOMContentLoaded",function(){renderMathInElement(document.body,{delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\[",right:"\\]",display:!0}]})})</script><script defer src=https://cdn.jsdelivr.net/npm/mermaid@8.14.0/dist/mermaid.min.js integrity=sha384-atOyb0FxAgN9LyAc6PEf9BjgwLISyansgdH8/VXQH8p2o5vfrRgmGIJ2Sg22L0A0 crossorigin></script>
<link rel=icon type=image/png sizes=32x32 href=https://b.hui.ke/icon_hub7ca0b5404c6d576559b2bd22c64b0e5_2009_32x32_fill_box_center_3.png><link rel=apple-touch-icon sizes=180x180 href=https://b.hui.ke/icon_hub7ca0b5404c6d576559b2bd22c64b0e5_2009_180x180_fill_box_center_3.png><meta name=description content="  《汇编语言（第3版）》11.7 ~ 11.9、《零基础入门学习汇编语言》P56 ~ 57"><script type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Docs","item":"https://b.hui.ke/docs/"},{"@type":"ListItem","position":2,"name":"汇编语言","item":"https://b.hui.ke/docs/assembly-language/"},{"@type":"ListItem","position":3,"name":"11.7 ~ 11.9","item":"https://b.hui.ke/docs/assembly-language/17/"}]}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"Article","mainEntityOfPage":{"@type":"WebPage","@id":"https://b.hui.ke/docs/assembly-language/17/"},"headline":"11.7 ~ 11.9 | 汇编语言 | Hui.Ke - Blog","datePublished":"2020-11-11T20:42:25+08:00","dateModified":"2020-11-11T20:42:25+08:00","wordCount":3191,"author":{"@type":"Person","name":"Hui.Ke"},"publisher":{"@type":"Person","name":"Hui.Ke","logo":{"@type":"ImageObject","url":"https://b.hui.ke/icon.png"}},"description":"\u003cp\u003e  《汇编语言（第3版）》11.7 ~ 11.9、《零基础入门学习汇编语言》P56 ~ 57\u003c\/p\u003e"}</script><meta property="og:title" content="11.7 ~ 11.9 | 汇编语言 | Hui.Ke - Blog"><meta property="og:type" content="article"><meta property="og:image" content="https://b.hui.ke/icon.png"><meta property="og:url" content="https://b.hui.ke/docs/assembly-language/17/"><meta property="og:description" content="  《汇编语言（第3版）》11.7 ~ 11.9、《零基础入门学习汇编语言》P56 ~ 57"><meta property="og:site_name" content="Hui.Ke - Blog"><meta property="article:published_time" content="2020-11-11T20:42:25+08:00"><meta property="article:modified_time" content="2020-11-11T20:42:25+08:00"><meta property="article:section" content="docs"><meta property="article:tag" content="adc"><meta property="article:tag" content="sbb"><meta property="article:tag" content="cmp"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/18/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/16/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/15/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/14/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/13/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/12/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/11/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/10/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/9/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/8/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/7/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/6/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/5/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/4/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/3/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/2/"><meta property="og:see_also" content="https://b.hui.ke/docs/assembly-language/1/"><script>!function(e){"use strict";!function(){var i,s=window,o=document,a=e,c="".concat("https:"===o.location.protocol?"https://":"http://","sdk.51.la/js-sdk-pro.min.js"),n=o.createElement("script"),r=o.getElementsByTagName("script")[0];n.type="text/javascript",n.setAttribute("charset","UTF-8"),n.async=!0,n.src=c,n.id="LA_COLLECT",a.d=n,i=function(){s.LA.ids.push(a)},s.LA?s.LA.ids&&i():(s.LA=e,s.LA.ids=[],i()),r.parentNode.insertBefore(n,r)}()}({id:"Jgb8aUbG5e3rqhrs",ck:"Jgb8aUbG5e3rqhrs",autoTrack:!0,hashMode:!0})</script><body class="flex min-h-screen flex-col"><header class="min-h-16 pl-scrollbar bg-secondary-bg fixed z-50 flex w-full items-center shadow-sm"><div class="mx-auto w-full max-w-screen-xl"><script>let storageColorScheme=localStorage.getItem("lightDarkMode");((storageColorScheme=="Auto"||storageColorScheme==null)&&window.matchMedia("(prefers-color-scheme: dark)").matches||storageColorScheme=="Dark")&&document.getElementsByTagName("html")[0].classList.add("dark")</script><nav class="flex items-center justify-between flex-wrap px-4 py-4 md:py-0"><a href=/ class="me-6 text-primary-text text-xl font-bold">Hui.Ke - Blog</a>
<button id=navbar-btn class="md:hidden flex items-center px-3 py-2" aria-label="Open Navbar">
<i class="fas fa-bars"></i></button><div id=target class="hidden block md:flex md:grow md:justify-between md:items-center w-full md:w-auto text-primary-text z-20"><div class="md:flex md:h-16 text-sm md:grow pb-4 md:pb-0 border-b md:border-b-0"><a href=/posts/ class="block mt-4 md:inline-block md:mt-0 md:h-(16-4px) md:leading-(16-4px) box-border md:border-t-2 md:border-b-2 border-transparent me-4">Posts</a>
<a href=/docs/ class="block mt-4 md:inline-block md:mt-0 md:h-(16-4px) md:leading-(16-4px) box-border md:border-t-2 md:border-b-2 selected-menu-item me-4">Docs</a>
<a href=/categories/ class="block mt-4 md:inline-block md:mt-0 md:h-(16-4px) md:leading-(16-4px) box-border md:border-t-2 md:border-b-2 border-transparent me-4">Categories</a>
<a href=/series/ class="block mt-4 md:inline-block md:mt-0 md:h-(16-4px) md:leading-(16-4px) box-border md:border-t-2 md:border-b-2 border-transparent me-4">Series</a>
<a href=/tags/ class="block mt-4 md:inline-block md:mt-0 md:h-(16-4px) md:leading-(16-4px) box-border md:border-t-2 md:border-b-2 border-transparent me-4">Tags</a>
<a href=/love/ class="block mt-4 md:inline-block md:mt-0 md:h-(16-4px) md:leading-(16-4px) box-border md:border-t-2 md:border-b-2 border-transparent me-4">Love</a>
<a href=/about/ class="block mt-4 md:inline-block md:mt-0 md:h-(16-4px) md:leading-(16-4px) box-border md:border-t-2 md:border-b-2 border-transparent me-4">About</a></div><div class=flex><div class="relative pt-4 md:pt-0"><div class="cursor-pointer hover:text-eureka" id=lightDarkMode><i class="fas fa-adjust"></i></div><div class="fixed hidden inset-0 opacity-0 h-full w-full cursor-default z-30" id=is-open></div><div class="absolute flex flex-col start-0 md:start-auto end-auto md:end-0 hidden bg-secondary-bg w-48 rounded py-2 border border-tertiary-bg cursor-pointer z-40" id=lightDarkOptions><span class="px-4 py-1 hover:text-eureka" name=Light>Light</span>
<span class="px-4 py-1 hover:text-eureka" name=Dark>Dark</span>
<span class="px-4 py-1 hover:text-eureka" name=Auto>Auto</span></div></div></div></div><div class="fixed hidden inset-0 opacity-0 h-full w-full cursor-default z-0" id=is-open-mobile></div></nav><script>let element=document.getElementById("lightDarkMode");storageColorScheme==null||storageColorScheme=="Auto"?document.addEventListener("DOMContentLoaded",()=>{window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",switchDarkMode)}):storageColorScheme=="Light"?(element.firstElementChild.classList.remove("fa-adjust"),element.firstElementChild.setAttribute("data-icon","sun"),element.firstElementChild.classList.add("fa-sun")):storageColorScheme=="Dark"&&(element.firstElementChild.classList.remove("fa-adjust"),element.firstElementChild.setAttribute("data-icon","moon"),element.firstElementChild.classList.add("fa-moon")),document.addEventListener("DOMContentLoaded",()=>{getcolorscheme(),switchBurger()})</script></div></header><main class="grow pt-16"><div class=pl-scrollbar><div class="mx-auto w-full max-w-screen-xl lg:px-4 xl:px-8"><div class=lg:pt-12><div class="flex flex-col md:flex-row bg-secondary-bg rounded"><div class="md:w-1/4 lg:w-1/5 border-e"><div class="sticky top-16 pt-6"><div id=sidebar-title class="md:hidden mx-4 px-2 pt-4 pb-2 md:border-b text-tertiary-text md:text-primary-text"><span class=font-semibold>Table of Contents</span>
<i class='fas fa-caret-right ms-1'></i></div><div id=sidebar-toc class="hidden md:block overflow-y-auto mx-6 md:mx-0 pe-6 pt-2 md:max-h-doc-sidebar bg-primary-bg md:bg-transparent"><div class="flex flex-wrap ms-4 -me-2 p-2 bg-secondary-bg md:bg-primary-bg rounded"><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/>汇编语言</a></div><ul class=ps-6><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/18/>11.9 ~ 11.11</a></div></li><li class=py-2><div><a class="text-eureka hover:text-eureka" href=https://b.hui.ke/docs/assembly-language/17/>11.7 ~ 11.9</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/16/>11.1 ~ 11.6</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/15/>10.8 ~ 10.12</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/14/>10.1 ~ 10.7</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/13/>9.7 ~ 9.9</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/12/>9.1 ~ 9.6</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/11/>8.5 ~ 8.9</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/10/>8.1</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/9/>7.1 ~ 7.10</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/8/>6.1 ~ 6.3</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/7/>5.1 ~ 5.4</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/6/>4.1 ~ 4.9</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/5/>3.6 ~ 3.10</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/4/>3.1 ~ 3.5</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/3/>2.8 ~ 2.12</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/2/>1.11 ~ 2.6</a></div></li><li class=py-2><div><a class=hover:text-eureka href=https://b.hui.ke/docs/assembly-language/1/>1.1 ~ 1.10</a></div></li></ul></div></div></div><div class="w-full md:w-3/4 lg:w-4/5 pb-8 pt-2 md:pt-8"><div class=flex><div class="w-full lg:w-3/4 px-6"><article class=prose><h1 class=mb-4>11.7 ~ 11.9</h1><div class="text-tertiary-text not-prose mt-2 flex flex-row flex-wrap items-center"><div class="me-6 my-2"><i class="fas fa-calendar me-1"></i>
<span>2020-11-11</span></div><div class="me-6 my-2"><i class="fa-solid fa-pen-to-square me-1"></i>
<span>2020-11-11</span></div><div class="me-6 my-2"><i class="fas fa-clock me-1"></i>
<span>7 min read</span></div><div class="me-6 my-2"><i class="fas fa-folder me-1"></i>
<a href=https://b.hui.ke/categories/it/ class=hover:text-eureka>IT</a></div><div class="me-6 my-2"><i class="fas fa-th-list me-1"></i>
<a href=https://b.hui.ke/series/x86asm-language/ class=hover:text-eureka>x86asm Language</a></div><div class="me-6 my-2"><i class="fa-solid fa-eye me-1"></i>
<span id=busuanzi_value_page_pv><i class="fa fa-spinner fa-spin"></i></span> Hits</div></div><p>  《汇编语言（第3版）》11.7 ~ 11.9、《零基础入门学习汇编语言》P56 ~ 57</p><p>  编程计算 1EF000H+201000H，结果放在 ax（高 16 位）和 bx（低 16 位）中。</p><pre><code class=language-x86asm>mov ax,001EH
mov bx,0F000H
add bx,1000H
adc ax,0020H
</code></pre><p>  adc 指令执行后，也可能产生进位值，所以也会对 CF 位进行设置。</p><p>  由于有这样的功能，我们就可以对任意大的数据进行加法运算。</p><p>  例如，编程计算 1EF0001000H+2010001EF0H，结果放在 ax（高 16 位）bx（次高 16 位）cx（低 16 位）中。</p><pre><code class=language-x86asm>mov ax,001EH
mov bx,0F000H
mov cx,1000H
add cx,1EF0H
adc bx,1000H
adc ax,0020H
</code></pre><p>  下面我们，编写一个子程序，对两个 128 位数据进行相加</p><p>  参数：ds:si 指向存储第一个数的内存空间，因数据为 128 位，所以需要 8 个字单元，由低地址单元到高地址单元依次存放 128 位数据由低到高的各个字。运算结果存储在第一个数的存储空间中。</p><p>  ds:di 指向存储第二个数的内存空间</p><pre><code class=language-x86asm>assume cs:code,ds:data
data segment
	db 88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h
	db 11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,
data ends

code segment
start:
	mov ax,data
	mov ds,ax
	mov si,0
	mov di,16

	mov cx,8

	call add128

	mov ax,4c00h
	int 21h
add128:
	push ax
	push cx
	push si
	push di

	sub ax,ax     # 将 CF 设置为 0
s:
	mov ax,[si]
	adc ax,[di]
	mov [si],ax
	inc si
	inc si
	inc di
	inc di
	loop s

	pop di
	pop si
	pop cx
	pop ax
	ret
code ends
end start
</code></pre><p>  思考：inc 和 loop 指令不影响 CF 位，上面的程序中，能不能将 4 个 inc 指令，用</p><pre><code class=language-x86asm>add si,2
add di,2
</code></pre><p>  取代？答：不能，因为 add 会影响 CF 位。</p><h3 id=117-sbb-指令>11.7 sbb 指令</h3><p>sbb 是带借位减法指令，它利用了 CF 位上记录的借位值</p><ol><li>格式：sbb 操作对象 1,操作对象 2</li><li>功能：操作对象 1= 操作对象 1- 操作对象 2-CF</li><li>比如：sbb ax,bx</li><li>实现功能：(ax)=(ax)-(bx)-CF</li></ol><p>  利用 sbb 指令我们可以对任意大的数据进行减法运算。</p><p>  计算 003E1000H-00202000H，结果放在 ax，bx 中，程序如下</p><pre><code class=language-x86asm>mov bx,1000H
mov ax,003EH
sub bx,2000H
sbb ax,0020H
</code></pre><p>  sbb 和 adc 是基于同样的思想设计的两条指令，在应用思路上和 adc 类似。在这里，我们就不再进行过多的讨论。</p><p>  通过学习这两条指令，我们可以进一步领会一下标志寄存器 CF 位的作用和意义。</p><h3 id=118-cmp-指令>11.8 cmp 指令</h3><p>  cmp 是比较指令，功能相当于减法指令，只是不保存结果。</p><p>  cmp 指令执行后，将对标志寄存器产生影响。</p><p>  其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果</p><ol><li>格式：cmp 操作对象 1,操作对象 2</li><li>功能：计算操作对象 1- 操作对象 2 但并不保存结果，仅仅根据计算结果对标志寄存器进行设置。</li><li>比如：cmp ax,ax</li><li>做 (ax)-(ax) 的运算，结果为 0，但并不在 ax 中保存，仅影响 flag 的相关各位。</li></ol><p>  指令执行后</p><ol><li>ZF=1</li><li>PF=1</li><li>SF=0</li><li>CF=0</li><li>OF=0</li></ol><p>  下面的指令</p><pre><code class=language-x86asm>mov ax,8
mov bx,3
cmp ax,bx     # 执行后：(ax)=8
ZF=0
PF=1
SF=0
CF=0
OF=0
</code></pre><p>  其实，我们通过 cmp 指令执行后，相关标志位的值就可以看出比较的结果。</p><p>  例如：cmp ax,bx</p><table><thead><tr><th style=text-align:left>如果</th><th style=text-align:left>则</th><th style=text-align:left>所以</th></tr></thead><tbody><tr><td style=text-align:left>(ax)=(bx)</td><td style=text-align:left>(ax)-(bx)=0</td><td style=text-align:left>ZF=1</td></tr><tr><td style=text-align:left>(ax)≠(bx)</td><td style=text-align:left>(ax)-(bx)≠0</td><td style=text-align:left>ZF=0</td></tr><tr><td style=text-align:left>(ax)＜(bx)</td><td style=text-align:left>(ax)-(bx) 将产生借位</td><td style=text-align:left>CF=1</td></tr><tr><td style=text-align:left>(ax)≥(bx)</td><td style=text-align:left>(ax)-(bx) 不必借位</td><td style=text-align:left>CF=0</td></tr><tr><td style=text-align:left>(ax)＞(bx)</td><td style=text-align:left>(ax)-(bx) 既不必借位，结果又不为0</td><td style=text-align:left>CF=0 且 ZF=0</td></tr><tr><td style=text-align:left>(ax)≤(bx)</td><td style=text-align:left>(ax)-(bx) 既可能借位，结果可能为 0</td><td style=text-align:left>CF=1 或 ZF=1</td></tr></tbody></table><p>  现在我们可以看出比较指令的设计思路</p><p>  即：通过做减法运算，影响标志寄存器，标志寄存器的相关位记录了比较的结果。</p><p>  反过来看上面的例子 cmp ax,ax</p><table><thead><tr><th style=text-align:left>如果</th><th style=text-align:left>说明</th></tr></thead><tbody><tr><td style=text-align:left>ZF=1</td><td style=text-align:left>(ax)=(bx)</td></tr><tr><td style=text-align:left>ZF=0</td><td style=text-align:left>(ax)≠(bx)</td></tr><tr><td style=text-align:left>CF=1</td><td style=text-align:left>(ax)＜(bx)</td></tr><tr><td style=text-align:left>CF=0</td><td style=text-align:left>(ax)≥(bx)</td></tr><tr><td style=text-align:left>CF=0 且 ZF=0</td><td style=text-align:left>(ax)＞(bx)</td></tr><tr><td style=text-align:left>CF=1 或 ZF=1</td><td style=text-align:left>(ax)≤(bx)</td></tr></tbody></table><p>  同 add、sub 指令一样，CPU 在执行 cmp 指令的时候，也包含两种含义：进行无符号数运算和进行有符号数运算。</p><p>  所以利用 cmp 指令可以对无符号数进行比较，也可以对有符号数进行比较。</p><p>  下面我们再来看一下如果用 cmp 来进行有符号数比较时，我们要注意哪些标志位！</p><p>  我们以 cmp ah,bh 为例进行说明</p><table><thead><tr><th style=text-align:left>如果</th><th style=text-align:left>则</th><th style=text-align:left>所以</th></tr></thead><tbody><tr><td style=text-align:left>(ah)=(bh)</td><td style=text-align:left>(ah)-(bh)=0</td><td style=text-align:left>ZF=1</td></tr><tr><td style=text-align:left>(ah)≠(bh)</td><td style=text-align:left>(ah)-(bh)≠0</td><td style=text-align:left>ZF=0</td></tr></tbody></table><p>  所以我们根据指令执行后 ZF 的值，就可以知道两个数据是否相等。</p><p>  我们继续看，如果 (ah)＜(bh) 则可能发生什么情况呢？</p><p>  对于有符号数运算，在 (ah)＜(bh) 情况下，(ah)-(bh) 显然可能引起 SF=1，即结果为负。</p><p>  比如：(ah)=1，(bh)=2：则 (ah)-(bh)=0FFH，0FFH 为 -1 的补码，因为结果为负，所以 SF=1。</p><p>  (ah)=0FEH，(bx)=0FFH：则 (ah)-(bh)=(-2)-(-1)=0FFH，因为结果为负，所以 SF=1。</p><blockquote><p>cmp 操作对象 1, 操作对象 2 指令执行后，SF=1，<strong>不能</strong><del>说明 操作对象 1＜ 操作对象 2</del></p></blockquote><p>  (ah)=22H，(bh)=0A0H：则 (ah)-(bh)=34-(-96)=130=82H，82H 是 -126 的补码，所以 SF=1。</p><p>  这里虽然 SF=1，但是并不能说明 (ah)＜(bh)，因为显然 34＞-96。</p><p>  两个有符号数 A 和 B 相减，得到的是负数，那么可以肯定 A＜B，这个思路没有错误；</p><p>  关键在于我们根据什么来断定得到的是一个负数。</p><p>  CPU 将 cmp 指令得到的结果记录在 flag 的相关标志位中。</p><p>  我们可以根据指令执行后，相关标志位的值来判断比较的结果。</p><p>  单纯的考察 SF 的值不可能知道结果的正负。因为 SF 记录的只是可以在计算机中存放的相应位数的结果的正负。</p><p>  比如 add ah,al 执行后，SF 记录的是 ah 中 8 位二进制信息所表示的数据的正负。</p><p>  如果没有发生溢出的话，那么实际结果的正负和逻辑上真正的结果正负就一致了。</p><p>  所以，我们应该在考察 SF（得知实际结果的正负）的同时考察 OF（得知有没有溢出）就可以得知逻辑上真正结果的正负，同时就可以知道比较的结果。</p><p>  下面，我们以 cmp ah,bh 为例，总结一下 CPU 执行 cmp 结果后，SF 和 OF 的值是如何来说明比较的结果的</p><ol><li>如果 SF=1，而 OF=0<ol><li>OF=0，说明没有溢出，逻辑上真正结果的正负 = 实际结果的正负</li><li>SF=1，实际结果为负，所以逻辑上真正的结果为负，所以 (ah)＜(bh)</li></ol></li><li>如果 SF=1，而 OF=1<ol><li>OF=1，说明有溢出，逻辑上真正结果的正负 ≠ 实际结果的正负</li><li>简单分析一下，就可以看出，如果因为溢出导致了实际结果为负，那么逻辑上真正的结果必然为正。这样，SF=1，OF=1，说明了 (ah)＞(bh)</li></ol></li><li>如果 SF=0，而 OF=1<ol><li>OF=1，说明有溢出，逻辑上真正结果的正负 ≠ 实际结果的正负</li><li>简单分析一下，就可以看出，如果因为溢出导致了实际结果为正，那么逻辑上真正的结果必然为负，这样，SF=0，OF=1，说明了 (ah)＜(bh)</li></ol></li><li>如果 SF=0，而 OF=0<ol><li>OF=0，说明没有溢出，逻辑上真正结果的正负 = 实际结果的正负</li><li>因 SF=0，实际结果非负，所以逻辑上真正的结果必然非负。所以 (ah)≥(bh)</li></ol></li></ol><p>  （博主将以上几点总结为表格形式如下表所示）</p><table><thead><tr><th style=text-align:left>SF</th><th style=text-align:left>说明</th><th style=text-align:left>OF</th><th style=text-align:left>说明</th><th style=text-align:left>所以</th></tr></thead><tbody><tr><td style=text-align:left>0</td><td style=text-align:left>结果非负</td><td style=text-align:left>0</td><td style=text-align:left>没有溢出，逻辑正负 = 实际正负</td><td style=text-align:left>(ah)≥(bh)</td></tr><tr><td style=text-align:left>0</td><td style=text-align:left>结果非负</td><td style=text-align:left>1</td><td style=text-align:left>有溢出，逻辑正负 ≠ 实际正负</td><td style=text-align:left>(ah)＜(bh)</td></tr><tr><td style=text-align:left>1</td><td style=text-align:left>实际为负</td><td style=text-align:left>0</td><td style=text-align:left>没有溢出，逻辑正负 = 实际正负</td><td style=text-align:left>(ah)＜(bh)</td></tr><tr><td style=text-align:left>1</td><td style=text-align:left>实际为负</td><td style=text-align:left>1</td><td style=text-align:left>有溢出，逻辑正负 ≠ 实际正负</td><td style=text-align:left>(ah)＞(bh)</td></tr></tbody></table><p>  上面，我们深入讨论了 cmp 指令在进行有符号数和无符号数比较时，对 flag 相关标志位的影响，和 CPU 如何通过相关的标志位来表示比较的结果。</p><p>  在学习中，要注意领会 8086 CPU 这种工作机制的设计思想。实际上，这种设计思想对于各种处理机来说是普遍的。</p><h3 id=119-检测比较结果的条件转移指令>11.9 检测比较结果的条件转移指令</h3><p>  下面的内容中我们将学习一些根据 cmp 指令的比较结果（即，cmp 指令执行后，相关标志位的值）进行工作的指令。</p><p>  它们检测的是哪些标志位呢？</p><p>  就是被 cmp 指令影响的那些，表示比较结果的标志位。</p><p>  这些条件转移指令通常都和 cmp 相配合使用，就好像 call 和 ret 指令通常相配合使用一样。</p><p>  因为 cmp 指令可以同时进行两种比较，无符号数和有符号数比较，所以根据 cmp 指令的比较结果进行转移的指令也分为两种，即</p><ol><li>根据无符号数的比较结果进行转移的条件转移指令，它们检测 ZF、CF 的值</li><li>根据有符号数的比较结果进行转移的条件转移指令，它们检测 SF、OF 和 ZF 的值</li></ol><p>  条件转移指令小结</p><table><thead><tr><th style=text-align:left>指令</th><th style=text-align:left>含义</th><th style=text-align:left>检测的相关标志位</th></tr></thead><tbody><tr><td style=text-align:left>je</td><td style=text-align:left>等于则转移</td><td style=text-align:left>ZF=1</td></tr><tr><td style=text-align:left>jne</td><td style=text-align:left>不等于则转移</td><td style=text-align:left>ZF=0</td></tr><tr><td style=text-align:left>jb</td><td style=text-align:left>低于则转移</td><td style=text-align:left>CF=1</td></tr><tr><td style=text-align:left>jnb</td><td style=text-align:left>不低于则转移</td><td style=text-align:left>CF=0</td></tr><tr><td style=text-align:left>ja</td><td style=text-align:left>高于则转移</td><td style=text-align:left>CF=0，ZF=0</td></tr><tr><td style=text-align:left>jna</td><td style=text-align:left>不高于则转移</td><td style=text-align:left>CF=1 或 ZF=1</td></tr></tbody></table><p>  这些指令比较常年用，它们都很好记忆，它们的第一个字母都是 j，表示 jump；后面的</p><ol><li>e：表示 equal</li><li>ne：表示 not equal</li><li>b：表示 below</li><li>nb：表示 not below</li><li>a：表示 above</li><li>na：表示 not above</li></ol><p>  注意观察一下它们所检测的标志位，都是 cmp 指令进行无符号数比较时候，记录比较结果的标志位。</p><p>  比如 je，检测 ZF 位，当 ZF=1 的时候进行转移，如果在 je 前面使用了 cmp 指令，那么 je 对 ZF 的检测，实际上就是间接地检测 cmp 的比较结果是否为两数相等。</p></article><div class=my-4><a href=https://b.hui.ke/tags/adc/ class="inline-block bg-tertiary-bg text-sm rounded px-3 py-1 my-1 me-2 hover:text-eureka">#adc</a>
<a href=https://b.hui.ke/tags/sbb/ class="inline-block bg-tertiary-bg text-sm rounded px-3 py-1 my-1 me-2 hover:text-eureka">#sbb</a>
<a href=https://b.hui.ke/tags/cmp/ class="inline-block bg-tertiary-bg text-sm rounded px-3 py-1 my-1 me-2 hover:text-eureka">#cmp</a></div><div class=py-2><div class="my-8 flex flex-col items-center md:flex-row"><a href=https://b.hui.ke/authors/hui.ke/ class="md:me-4 text-primary-text h-24 w-24"><img src=https://b.hui.ke/bagua.webp class="bg-primary-bg w-full rounded-full" alt=Avatar></a><div class="mt-4 w-full md:mt-0 md:w-auto"><a href=https://b.hui.ke/authors/hui.ke/ class="mb-2 block border-b pb-1 text-lg font-bold"><h3>Hui.Ke</h3></a><span class="block pb-2">❤ Cyber Security | Safety is a priority.</span>
<a href=mailto:3199731997@qq.com class=me-2><i class="fas fa-envelope"></i></a>
<a href="https://wpa.qq.com/msgrd?v=3&uin=3199731997" class=me-2><i class="fab fa-qq"></i></a>
<a href=/images/aixinxianquan.webp class=me-2><i class="fab fa-weixin"></i></a></div></div></div><div class="-mx-2 mt-4 flex flex-col border-t px-2 pt-4 md:flex-row md:justify-between"><div><span class="text-primary-text block font-bold">Previous</span>
<a href=https://b.hui.ke/docs/assembly-language/18/ class=block>11.9 ~ 11.11</a></div><div class="mt-4 md:mt-0 md:text-right"><span class="text-primary-text block font-bold">Next</span>
<a href=https://b.hui.ke/docs/assembly-language/16/ class=block>11.1 ~ 11.6</a></div></div><div id=valine-comments class=mt-4></div><script defer src=https://cdn.jsdelivr.net/npm/valine@1.4.16/dist/Valine.min.js integrity=sha384-e0+DNUCJo75aOAzHQbFWYBCM9/S4f0BhRJXvEgbE3mMS85RM20MSSGStHuNdY2QK crossorigin></script>
<script>document.addEventListener("DOMContentLoaded",function(){new Valine({el:"#valine-comments",appId:"BQnVqWIiq78AdqwyhvBVAa3y-MdYXbMMI",appKey:"RKg5By312YjM8rU6WkkfK9IN",recordIP:"true",serverURLs:"https://l.hui.ke",visitor:"true"})})</script></div><div class="hidden lg:block lg:w-1/4"><div class="bg-secondary-bg
prose sticky top-16 z-10 hidden px-6 py-4 lg:block"><h3>On This Page</h3></div><div class="sticky-toc
border-s
hidden px-6 pb-6 lg:block"><nav id=TableOfContents><ul><li><ul><li><a href=#117-sbb-指令>11.7 sbb 指令</a></li><li><a href=#118-cmp-指令>11.8 cmp 指令</a></li><li><a href=#119-检测比较结果的条件转移指令>11.9 检测比较结果的条件转移指令</a></li></ul></li></ul></nav></div><script>window.addEventListener("DOMContentLoaded",()=>{enableStickyToc()})</script></div></div></div></div></div><script>document.addEventListener("DOMContentLoaded",()=>{hljs.highlightAll(),changeSidebarHeight(),switchDocToc()})</script></div></div></main><footer class=pl-scrollbar><div class="mx-auto w-full max-w-screen-xl"><div class="text-center p-6 pin-b"><script async src=/js/click.js></script><div id=poem_ip></div><script type=text/javascript>jinrishici.load(function(e){tags.innerHTML=e.data.matchTags})</script><div><span id=timeDate>载入年天数...</span><span id=times>载入时分秒...</span>
<script async src=/js/duration.js></script></div><a href=https://www.foreverblog.cn/go.html target=_blank><img src=https://img.foreverblog.cn/wormhole_4_tp.gif alt style=display:inline-block;width:auto;height:32px title=穿梭虫洞-随机访问十年之约友链博客></a><p class="text-sm text-tertiary-text"><script async src=//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js></script>本站总访问量 <span id=busuanzi_value_site_pv></span> 次
&#183; 您是本站的第 <span id=busuanzi_value_site_uv></span> 个小伙伴</p><script async src=/js/tab.js></script></div></div></footer></body></html>